package com.cfjjc.gz.common.taglib;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
import com.cfjjc.gz.common.cache.CacheUtil;

/**
 * 功能说明：完成系统中各种下拉列表的标签<p>
 * 
 * <b>属性说明</b>
 * <ul>
 * <li>name:表示下拉列表的名称，必须。</li>
 * <li>cachetype:缓存类型,必须</li> 
 * <li>width:列表宽度,可选，默认使用150</li> 
 * <li>initvalue:初始值,可选,支持EL表达式</li> 
 * <li>cannull:是否添加一空值行,可选，为1则在下来列表中增加一个<option value=""></li> 
 * <li>valueprop:选项值属性,必须</li> 
 * <li>nameprop:选项名称属性,必须</li> 
 * <li>exclueValue:排除值</li> 
 * <li>orderby:排序,可选,与sql中排序写法一致.如name desc,code 
 * <li>event:事件处理函数,可选</li>
 * <li>excludeValue：指定结果列表中排除的值</li>
 * <li>orderby：指定结果列表的排序 </li>
 * <li>condnames：用于指定查询条件名称  </li>
 * <li>condvalues：指明查询条件值  </li>
 * <li>addoptionname：手动添加一个option,指明option name </li>
 * <li>addoptionvalue：手动添加一个option,指明option value </li>
 * </ul>
 */
public class SelectTag extends TagSupport {

	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(SelectTag.class);

	private static final long serialVersionUID = 1143239462499702362L;

	private String id;// 选择框的id

	private String name; // 选择框的名称

	private Object initvalue; // 下拉列表初始选中值

	private String cachetype; // 下拉列表类型

	private String event; // 下拉列表事件，比如onchange='itemOnChange()'

	private String cannull; // 是否添加一空白option项

	private String valueprop; // 值属性名

	private String nameprop; // 名称属性名

	private String orderby;// 排序,写法类似sql中的排序

	private String excludevalue;// 返回结果中不包含的值

	private String condnames;// 查询条件名称,多个名称用逗号分隔

	private String condvalues;// 查询条件值,值之间用逗号分隔

	private String addoptionname;// 手动添加的一个option,指明option name

	private String addoptionvalue;// 手动添加的一个option,指明option value

	private String styleClass;// 样式设置

	private String style;// 额外的样式设置
	
	private String disabled;// 停用

	public int doStartTag() throws JspException {

		StringBuffer buf = new StringBuffer();

		buf.append("<select name=\"").append(name);
		
		if (styleClass == null) {
			buf.append("\" class=\"formselect\" ");
		} else {
			buf.append("\" class=\"" + styleClass + "\" ");
		}

		// 添加id
		if (id != null) {
			buf.append(" id=\"" + id + "\"");
		}
		// 添加事件处理
		if (event != null) {
			buf.append(event);
		}
		if (style != null) {
			buf.append(" style=\"" + style + "\"");
		}

		if (disabled != null) {
			buf.append(" disabled=\"" + disabled + "\"");
		}

		buf.append(">");

		// 检查是否需要加入一个空的下拉选项
		if ("1".equals(cannull)) {
			// 等于初值,则选中
			if (getInitValue().equalsIgnoreCase("") || getInitValue() == null) {
				buf.append("<option value=\"\" selected></option>");
			} else {
				buf.append("<option value=\"\"></option>");
			}
		}
		if (addoptionname != null && !addoptionname.equals("")) {
			buf.append("<option value=\"").append(addoptionvalue).append("\"");
			// 等于初值,则选中
			if (getInitValue().equalsIgnoreCase(addoptionvalue)) {
				buf.append(" selected ");
			}
			buf.append(">").append(addoptionname).append("</option>");
		}

		try {
			Collection list = null;
			Map<String, Object> queryMap = new HashMap<String, Object>();
			
			if ((condnames== null || "".equals(condnames)) ||
					(condvalues == null || "".equals(condvalues))) {
					//throw new IllegalArgumentException("查询条件与查询值不能为空");
				logger.debug("未设置查询条件，查询所有数据!");
			} else {

				String[] names = condnames.split(";");
				String[] values = condvalues.split(";");
				
				if (names.length != values.length) {
					throw new IllegalArgumentException("查询条件与查询值个数不匹配");
				}
				
				for (int i = 0; i < names.length; i++) {
					queryMap.put(names[i], values[i]);
				}
			}
			list = CacheUtil.getList(cachetype, queryMap, orderby);

			// 遍历取得的数据，插入到Select中间
			if (list != null) {
				// 遍历插入Select中间
				for (Iterator iterator = list.iterator(); iterator.hasNext();) {
					Object obj = iterator.next();
					String value = String.valueOf(PropertyUtils.getProperty(obj, valueprop));

					// 排除指定的属性值
					if (excludevalue != null && excludevalue.equals(value)) {
						continue;
					}
					buf.append("<option value=\"").append(value).append("\"");

					// 等于初值,则选中
					if (getInitValue().equalsIgnoreCase(value)) {
						buf.append(" selected ");
					}
					buf.append(">").append(PropertyUtils.getProperty(obj, nameprop)).append("</option>");
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
		} finally {
			buf.append("</select>");
			try {
				pageContext.getOut().print(buf.toString());
			} catch (Exception e) {
				logger.error(e.getMessage());
			}
		}
		return EVAL_PAGE;
	}

	/**
	 * 取得初始值
	 */
	private String getInitValue() {

		String result = "";

		if (this.initvalue != null) {
			result = String.valueOf(initvalue);
		}
		return result;
	}

	/*
	 * 以下为get,set方法
	 */
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Object getInitvalue() {
		return initvalue;
	}

	public void setInitvalue(Object initvalue) throws JspException {
		this.initvalue = ExpressionEvaluatorManager.evaluate("initvalue", String.valueOf(initvalue), Object.class, this, pageContext);
	}

	public String getEvent() {
		return event;
	}

	public void setEvent(String event) {
		this.event = event;
	}

	public String getCachetype() {
		return cachetype;
	}

	public void setCachetype(String cachetype) {
		this.cachetype = cachetype;
	}

	public String getNameprop() {
		return nameprop;
	}

	public void setNameprop(String nameprop) {
		this.nameprop = nameprop;
	}

	public String getValueprop() {
		return valueprop;
	}

	public void setValueprop(String valueprop) {
		this.valueprop = valueprop;
	}

	public String getCannull() {
		return cannull;
	}

	public void setCannull(String cannull) {
		this.cannull = cannull;
	}

	public String getExcludevalue() {
		return excludevalue;
	}

	public void setExcludevalue(String excludevalue) {
		this.excludevalue = excludevalue;
	}

	public String getOrderby() {
		return orderby;
	}

	public void setOrderby(String orderby) {
		this.orderby = orderby;
	}

	public String getCondnames() {
		return condnames;
	}

	public void setCondnames(String condnames) {
		this.condnames = condnames;
	}

	public String getCondvalues() {
		return condvalues;
	}

	public void setCondvalues(String condvalues) {
		this.condvalues = condvalues;
	}

	/**
	 * @return addoptionname
	 */
	public String getAddoptionname() {
		return addoptionname;
	}

	/**
	 * @param addoptionname 要设置的 addoptionname
	 */
	public void setAddoptionname(String addoptionname) {
		this.addoptionname = addoptionname;
	}

	/**
	 * @return addoptionvalue
	 */
	public String getAddoptionvalue() {
		return addoptionvalue;
	}

	/**
	 * @param addoptionvalue 要设置的 addoptionvalue
	 */
	public void setAddoptionvalue(String addoptionvalue) {
		this.addoptionvalue = addoptionvalue;
	}

	
	public String getStyleClass() {
		return styleClass;
	}

	
	public void setStyleClass(String styleClass) {
		this.styleClass = styleClass;
	}

	/**
	 * @return style
	 */
	public String getStyle() {
		return style;
	}

	/**
	 * @param style 要设置的 style
	 */
	public void setStyle(String style) {
		this.style = style;
	}

	/**
	 * @return 返回 停用状态
	 */
	public String getDisabled() {
		return disabled;
	}

	/**
	 * @param disabled 要设置的 停用状态
	 */
	public void setDisabled(String disabled) {
		this.disabled = disabled;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

}
